/*Copyright (C) 2009 - 2011 MASSART GAUTHIER

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "../headers.h"

#define TAILLE_MAX 1000

void pendu_jeu(void) {
	short continuer = 0;
	char *contenu_titre = "PENDU";

	clear();

	afficher_titre(contenu_titre);

	get_player_name(0, prenom);



	while(continuer != 2) {
		char lettre = 0;
		char lettresTestees[100];
		char mot_mystere[40] = {0};
		char *lettre_trouvee = NULL;
		short tours_restants = 10, fautes = 0;
		short i = 0;
		short j = 0;
		short taille_mot = 0;
		short fin = 0;

		if(fichier_existe("dico.ini") == true) {
			long k, nb_mots = 0, ligne_mot_pioche;
			char texte[256];

			for(k = 0; ini_getkey("MOTS", k, texte, sizearray(texte), "dico.ini") > 0; k++) {
				nb_mots++;
			}

			ligne_mot_pioche = random(0, nb_mots);

			ini_getkey("MOTS", ligne_mot_pioche, mot_mystere, sizearray(mot_mystere), "dico.ini");
		}
		else {
			return;
		}

		taille_mot = strlen(mot_mystere);

		lettre_trouvee = malloc(taille_mot * sizeof(int));

		for(i = 0 ; i < taille_mot ; i++)
			lettre_trouvee[i] = 0;

		clear();
		afficher_titre(contenu_titre);

		CSLP_ColorText(CT);

		while(tours_restants > 0 && !pendu_gagne(lettre_trouvee, taille_mot)) {
			addstr("\n\n\n Il vous reste ");
			CSLP_ColorText(COLOR_WHITE);
			printw("%ld", tours_restants);
			CSLP_ColorText(CT);
			addstr(" coups à jouer\n");
			addstr(" Quel est le mot secret ? ");

			for(i = 0 ; i < taille_mot ; i++) {
				if(lettre_trouvee[i]) {
					CSLP_ColorText(COLOR_RED);
					addch(mot_mystere[i]);
					CSLP_ColorText(CT);
				}
				else {
					addstr("*");
				}
			}

			addstr("\n\n Vous avez déjà proposé : ");

			for(i = 0; i != j; i++) {
				CSLP_ColorText(COLOR_RED);
				addch(lettresTestees[i]);
				CSLP_ColorText(CT);
			}

			addstr("\n\n Proposez une lettre : ");

			refresh();
			CSLP_ColorText(COLOR_RED);
			lettre = pendu_read_char();
			CSLP_ColorText(CT);

			if(lettre != '0')
				lettresTestees[j] = lettre;

			if(lettre == '0') {
				short retour = 0;
				clear();
				retour = afficher_menu("Oui\nNon\n", "Voulez-vous quitter la partie en cours ?\n", contenu_titre);

				if(retour == 1) {
					tours_restants = 0;
					fin = 1;
				}

				clear();
			}

			if((lettre != '0') && (!pendu_recherche_lettre(lettre, mot_mystere, lettre_trouvee))) {
				tours_restants--;
			}

			clear();

			if(fin != 1) {
				afficher_titre(contenu_titre);
				bonhomme(tours_restants);
			}

			CSLP_ColorText(CT);

			if(lettre != '0')
				j++;
		}


		if(pendu_gagne(lettre_trouvee, taille_mot)) {
			gagner();
			afficher_titre(contenu_titre);
			CSLP_ColorText(CT);
			addstr("\n Bravo ");
			CSLP_ColorText(COLOR_RED);
			addstr(prenom);
			CSLP_ColorText(CT);
			addstr("! Le mot secret était bien :");
			CSLP_ColorText(COLOR_GREEN);
			fautes = 10 - tours_restants;
			printw(" %s \n\n", mot_mystere);
			save_score("Pendu", fautes, 0, mot_mystere);
			refresh();
			getch();
			clear();
			lire_suppr_score("Pendu", true);
			getch();
			clear();
		}
		else if(fin == 0) {
			perdu();
			afficher_titre(contenu_titre);
			CSLP_ColorText(CT);
			addstr(" Dommage ");
			CSLP_ColorText(COLOR_RED);
			addstr(prenom);
			CSLP_ColorText(CT);
			addstr("! Le mot secret était :");
			CSLP_ColorText(COLOR_GREEN);
			printw(" %s \n\n", mot_mystere);
			refresh();
			getch();
			clear();
		}

		free(lettre_trouvee);

		continuer = afficher_menu_recommencer(contenu_titre);
		CSLP_ColorText(CT);
	}
}

void pendu_jeu_2(void) {
	short continuer = 0;
	char *contenu_titre = "PENDU";
	char prenom2[100];
	clear();
	afficher_titre(contenu_titre);
	get_player_name(1, prenom);
	get_player_name(2, prenom2);


	while(continuer != 2) {

		short score1[50] = {0}, score2[50] = {0}, total1 = 0, total2 = 0, joueur = 1;
		short NombreDeManches = 0, MancheActuelle = 0;
		char lettre = 0;
		char lettresTestees[100];
		char mot_mystere[40] = {0};
		char caractereActuel = 0;
		char *lettre_trouvee = NULL;
		short tours_restants = 10, fautes = 0;
		short i = 0;
		short j = 0;
		short taille_mot = 0;
		short infoScore = 0;

		clear();
		afficher_titre(contenu_titre);
		CSLP_ColorText(CT);
		addstr("\n Combien de manches voulez-vous jouer ? ");
		NombreDeManches = lire_long();
		clear();


		while(NombreDeManches != MancheActuelle  || joueur != 1) {
			lettre = 0;
			caractereActuel = 0;
			tours_restants = 10, fautes = 0, i = 0, j = 0, taille_mot = 0, infoScore = 0;

			if(joueur == 1)
				MancheActuelle++;

			clear();
			afficher_titre(contenu_titre);
			CSLP_ColorText(CT);
			addstr("\n Manche ");
			CSLP_ColorText(COLOR_RED);
			printw("%li ", MancheActuelle);
			CSLP_ColorText(CT);
			addstr("/");
			CSLP_ColorText(COLOR_RED);
			printw(" %li ", NombreDeManches);
			CSLP_ColorText(CT);
			addstr(".\n\n");
			CSLP_ColorText(COLOR_RED);

			if(joueur == 1)
				printw("\n\n %s", prenom);
			else
				printw("\n\n %s", prenom2);

			CSLP_ColorText(CT);
			addstr(", veuillez entrer le mot que ");
			CSLP_ColorText(COLOR_RED);

			if(joueur == 1)
				addstr(prenom2);
			else
				addstr(prenom);

			CSLP_ColorText(CT);
			addstr(" devra retrouver : ");
			refresh();
			lire(mot_mystere, 40);

			do {
				caractereActuel = mot_mystere[i];
				mot_mystere[i] = toupper(caractereActuel);
				i++;
			}

			while(caractereActuel != '\0');

			if(!pendu_rechercher_mot(mot_mystere)) {
				short choix = 0;
				clear();
				choix = afficher_menu("Oui\nNon\n", "Le mot que vous venez d'entrer ne figure pas dans dico.ini! Voulez-vous l'y ajouter ?", contenu_titre);

				if(choix == 1) {
					ini_putl("MOTS", mot_mystere, 0, "dico.ini");
					printw("\n Le mot %s a bien été ajouté.", mot_mystere);
					getch();
				}
			}

			clear();

			taille_mot = strlen(mot_mystere);

			lettre_trouvee = malloc(taille_mot * sizeof(char));

			for(i = 0 ; i < taille_mot ; i++)
				lettre_trouvee[i] = 0;

			clear();

			afficher_titre(contenu_titre);

			CSLP_ColorText(CT);

			while(tours_restants > 0 && !pendu_gagne(lettre_trouvee, taille_mot)) {
				CSLP_ColorText(CT);
				addstr("\n\n\n Il vous reste ");
				CSLP_ColorText(COLOR_WHITE);
				printw("%ld", tours_restants);
				CSLP_ColorText(CT);
				addstr(" coups à jouer\n");
				addstr(" Quel est le mot secret ? ");

				for(i = 0 ; i < taille_mot ; i++) {
					if(lettre_trouvee[i]) {
						CSLP_ColorText(COLOR_RED);
						addch(mot_mystere[i]);
						CSLP_ColorText(CT);
					}
					else {
						addstr("*");
					}
				}

				addstr("\n\n Vous avez déjà proposé : ");

				for(i = 0; i != j; i++) {
					CSLP_ColorText(COLOR_RED);
					addch(lettresTestees[i]);
					CSLP_ColorText(CT);
				}

				addstr("\n\n Proposez une lettre : ");

				refresh();
				CSLP_ColorText(COLOR_RED);
				lettre = pendu_read_char();
				CSLP_ColorText(CT);
				lettresTestees[j] = lettre;

				if(lettre == '0') {
					tours_restants = 0;
				}

				if(!pendu_recherche_lettre(lettre, mot_mystere, lettre_trouvee)) {
					tours_restants--;
				}

				clear();

				afficher_titre(contenu_titre);
				bonhomme(tours_restants);
				CSLP_ColorText(CT);
				j++;
			}

			if(pendu_gagne(lettre_trouvee, taille_mot)) {
				clear();
				afficher_titre(contenu_titre);
				CSLP_ColorText(CT);
				addstr("\n Bravo ");
				CSLP_ColorText(COLOR_RED);

				if(joueur == 1)
					addstr(prenom2);
				else
					addstr(prenom);

				CSLP_ColorText(CT);
				addstr("! Le mot secret était bien :");
				CSLP_ColorText(COLOR_GREEN);
				printw(" %s \n\n", mot_mystere);

				fautes = 10 - tours_restants;

				if(joueur == 1)
					score2[MancheActuelle] = fautes;
				else
					score1[MancheActuelle] = fautes;

				refresh();
				getch();
				clear();
			}
			else {
				clear();
				afficher_titre(contenu_titre);
				CSLP_ColorText(CT);
				addstr("\n Dommage ");
				CSLP_ColorText(COLOR_RED);

				if(joueur == 1)
					addstr(prenom2);
				else
					addstr(prenom);

				CSLP_ColorText(CT);
				addstr("! Le mot secret était :");
				CSLP_ColorText(COLOR_GREEN);
				printw(" %s \n\n", mot_mystere);

				if(joueur == 1)
					score2[MancheActuelle] = fautes;
				else
					score1[MancheActuelle] = fautes;

				refresh();
				getch();
				clear();
			}

			if(joueur == 1)
				joueur++;
			else
				joueur--;

			free(lettre_trouvee);

		}

		clear();

		afficher_titre(contenu_titre);
		CSLP_ColorText(COLOR_WHITE);
		addstr("\n Résultats :\n\n");

		addstr("\t┌──────────────┬───────────────────────────────────────┬───────────────────────────────────────┐\n");
		addstr("\t│XXXXXXXXXXXXXX│                                       │                                       │\n");
		addstr("\t├──────────────┼───");
		save_cursor_pos();
		pmove(HAUT, 1);
		CSLP_ColorText(COLOR_RED);
		addstr(prenom);
		CSLP_ColorText(COLOR_WHITE);
		restore_cursor_pos();
		addstr("────────────────────────────────────┼───");
		save_cursor_pos();
		pmove(HAUT, 1);
		CSLP_ColorText(COLOR_RED);
		addstr(prenom2);
		CSLP_ColorText(COLOR_WHITE);
		restore_cursor_pos();
		addstr("────────────────────────────────────┤\n");
		i = 1;

		while(i != NombreDeManches + 1) {
			printw("\t│Manche n°%ld    │   %ld fautes                            │   %ld fautes                            │\n", i, score1[i], score2[i]);

			if(score1[i] < score2[i]) {
				total1++;
			}
			else if(score1[i] > score2[i]) {
				total2++;
			}

			i++;
		}

		addstr("\t├──────────────┼───────────────────────────────────────┼───────────────────────────────────────┤\n");
		printw("\t│Partie gagnée │   %ld                                   │   %ld                                   │\n", total1, total2);
		addstr("\t└──────────────┴───────────────────────────────────────┴───────────────────────────────────────┘\n");
		refresh();
		vider_buffer();
		getch();
		clear();
		continuer = afficher_menu_recommencer(contenu_titre);
	}
}
